<?php

namespace app\teacher\controller\course;

use app\common\controller\Frontend;
use app\common\enums\ArticleStatusEnum;
use app\common\enums\CourseStatusEnum;
use app\common\enums\LearnCourseTypeEnum;
use app\common\enums\CourseDictTypeEnum;
use app\common\enums\LearnMeansEnum;
use app\common\service\course\LexiconService;
use app\common\model\banxi\course\Course as CourseModel;
use app\common\model\banxi\student\StudentCourse;
use app\common\model\banxi\course\CourseDict;
use app\common\model\banxi\course\CourseArticle;
use app\common\model\banxi\learn\LearnReadingArticle;
use think\facade\Log;

/*
 * 课程
 * */
class Course extends Frontend
{
    protected array $noNeedLogin = [''];

    protected array $noNeedPermission = ['*'];

    public function initialize(): void
    {
        parent::initialize();
    }

    /*
     * 查询-课程详情
     * */
    public function getCourseDetail()
    {
        $courseId = $this->request->get('courseId');

        $CourseModel = new CourseModel();
        $list = $CourseModel->where(['id'=>$courseId])->find();

        $this->ok('操作成功',$list);
    }

    /**
     * 查询教材列表
     * @param int|null $studentId 学员ID，传了就查学员的
     * @return array 教材列表
     */
    public function listBooks($studentId = null)
    {
        $studentId = $this->request->get('studentId');
        $bookIds = null;

        // 如果传了学生ID，则查询该学生开通的单词速记课程所使用的教材ID列表
        if ($studentId) {
            // 获取学生的所有课程ID
            $StudentCourseModel = new StudentCourse();
            $courseIds = $StudentCourseModel->listByStudentId($studentId);

            // 如果学生没有课程，返回空数组
            if (empty($courseIds)) {
                $this->ok('操作成功');
            }

            // 查询这些课程中课程类型为"单词速记"的课程所使用的教材ID列表
            $CourseModel = new CourseModel();
            $bookIds = $CourseModel
                ->field('courseBook')
                ->where('id', 'in', $courseIds)
                ->where('courseType', '=', LearnCourseTypeEnum::WORD) // WORD类型对应值
                ->group('courseBook')
                ->select()
                ->column('courseBook');
        }

        // 查询教材字典数据
        $CourseDictModel = new CourseDict();
        $query = $CourseDictModel
            ->where('courseDictType', '=', CourseDictTypeEnum::BOOKS); // BOOKS类型对应值

        // 如果有教材ID限制，则添加条件
        if (!empty($bookIds)) {
            $query->where('id', 'in', $bookIds);
        }

        $list = $query->select();

        $this->ok('操作成功',$list);
    }

    /**
     * 查询学员开通课程
     * @param int|null $studentId 学员ID，不传则查询所有课程
     * @param int|null $courseType 课程类型（10000 单词速记 10001 阅读理解 10002 超级听力）
     * @param bool|null $isPractice 是否体验课
     * @param int|null $bookId 教材ID
     * @return array 课程列表
     */
    public function listStudentOpen($studentId = null, $courseType = null, $isPractice = null, $bookId = null)
    {
        $studentId = $this->request->get('studentId');
        $courseType = $this->request->get('courseType');
        $isPractice = $this->request->get('isPractice');
        $bookId = $this->request->get('bookId');
        $CourseModel = new CourseModel();
        // 只查询启用状态的课程
        $query = $CourseModel->where('status', '=', '1');
        // 处理体验课逻辑
        if ($isPractice === true) {
            // 查询体验课程
            $query->where('courseExperience', '=', 1);
        } else {
            // 查询学生已开通的课程
            $courseIds = [];
            if ($studentId !== null) {
                $StudentCourseModel = new StudentCourse();
                $courseIds = $StudentCourseModel->listByStudentId($studentId);
            }

            // 如果提供了学生ID但该学生没有开通课程，则返回空数组
            if ($studentId  && !$courseIds) {
                $this->ok('操作成功');
            }

            // 如果有课程ID列表，则添加到查询条件中
            if ($courseIds) {
                $query->whereIn('id', $courseIds);
            }
        }

        // 根据课程类型筛选
        if ($courseType !== null) {
            $query->where('courseType', '=', $courseType);
        }

        // 根据教材ID筛选
        if ($bookId !== null) {
            $query->where('courseBook', '=', $bookId);
        }

        $list = $query->select();

        $this->ok('操作成功',$list);
    }

    /**
     * 查询-课程列表
     * @param int $courseType 课程类型（10000 单词速记 10001 阅读理解 10002 超级听力）
     * @param int $bookId 教材ID
     * @return array
     */
    public function listCourse($courseType = null, $bookId = null)
    {
        $courseType = $this->request->get('courseType');
        $bookId = $this->request->get('bookId');
        // 构建查询条件
        $CourseModel = new CourseModel();
        $where = [];
        $where[] = ['status', '=', CourseStatusEnum::E1];
        // 如果提供了课程类型，则按课程类型筛选
        if ($courseType) {
            $where[] = ['courseType', '=', $courseType];
        }

        // 如果提供了教材ID，则按教材ID筛选
        if ($bookId) {
            $where[] = ['courseBook', '=', $bookId];
        }
        // 执行查询并返回结果
        $list = $CourseModel->select();

        $this->ok('操作成功',$list);
    }

    /**
     * 查询-课程文章
     * @param int $courseId 教材ID
     * @param int $studentId 学员ID
     * @return array
     */
    public function listReadingByCourseId()
    {
        $courseId = $this->request->get('courseId');
        $studentId = $this->request->get('studentId');

        // 查询课程文章列表，只查询启用状态的文章，并按sort_num升序排列
        $CourseArticleModel = new CourseArticle();
        $trainerList = $CourseArticleModel
            ->where('courseId', $courseId)
            ->where('status', ArticleStatusEnum::E1) // 对应 ArticleStatus.E1 启用状态
            ->order('sortNum', 'asc')
            ->field('id, courseId, name')
            ->select()
            ->toArray();

        // 如果提供了学生ID，则查询该学生已学习的文章
        if ($studentId) {
            // 提取文章ID列表
            $articleIds = array_column($trainerList, 'id');

            if (!empty($articleIds)) {
                // 查询学生已学习的文章ID列表（教学类型）
                $LearnReadingArticleModel = new LearnReadingArticle();
                $learnArticleIds = $LearnReadingArticleModel
                    ->where('studentId', $studentId)
                    ->where('isSubmit', 1)
                    ->where('learnMeans', LearnMeansEnum::E1) // 对应 LearnMeans.E1 教学类型
                    ->whereIn('articleId', $articleIds)
                    ->column('articleId');

                // 标记已学习的文章
                foreach ($trainerList as &$item) {
                    $item['isLearned'] = in_array($item['id'], $learnArticleIds);
                }
            }
        } else {
            // 如果没有提供学生ID，则默认所有文章未学习
            foreach ($trainerList as &$item) {
                $item['isLearned'] = false;
            }
        }

        $this->ok('操作成功',$trainerList);
    }

}